package cn.flying.cloud.base.common.utils.date;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * date操作工具类
 *
 * @author: admin
 * @date: 2022年04月02日 21:50
 * @version: 1.0
 */
public class DateUtil extends DateUtils {
    private static final Logger logger = LoggerFactory.getLogger(DateUtil.class);

    /**
     * date format yyyy
     */
    public static final String DATE_FORMAT_1 = "yyyy";
    /**
     * date format yyyyMM
     */
    public static final String DATE_FORMAT_2 = "yyyyMM";
    /**
     * date format yyyyMMdd
     */
    public static final String DATE_FORMAT_3 = "yyyyMMdd";
    /**
     * date format yyyy年MM月
     */
    public static final String DATE_FORMAT_4 = "yyyy年MM月";
    /**
     * date format yyyy年MM月dd日
     */
    public static final String DATE_FORMAT_5 = "yyyy年MM月dd日";

    /**
     * time format HHmmss
     */
    public static final String TIME_FORMAT_1 = "HHmmss";
    /**
     * time format HHmm
     */
    public static final String TIME_FORMAT_2 = "HHmm";

    /**
     * datetime format yyyyMMddHHmmssSSS
     */
    public static final String DATE_TIME_FORMAT_1 = "yyyyMMddHHmmssSSS";
    /**
     * datetime format yyyyMMddHHmmss
     */
    public static final String DATE_TIME_FORMAT_2 = "yyyyMMddHHmmss";
    /**
     * datetime format yyyyMMddHHmm
     */
    public static final String DATE_TIME_FORMAT_3 = "yyyyMMddHHmm";
    /**
     * datetime format yyyy-MM-dd HH:mm:ss
     */
    public static final String DATE_TIME_FORMAT_4 = "yyyy-MM-dd HH:mm:ss";
    /**
     * datetime format yyyy-MM-dd HH:mm
     */
    public static final String DATE_TIME_FORMAT_5 = "yyyy-MM-dd HH:mm";
    /**
     * datetime format yyyy年MM月dd日 HH时mm分ss秒
     */
    public static final String DATE_TIME_FORMAT_6 = "yyyy年MM月dd日 HH时mm分ss秒";


    /**
     * Date类型转为指定格式的String类型
     *
     * @param source
     * @param pattern
     * @return
     */
    public static String formatDate(Date source, String pattern) {
        SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
        return dateFormat.format(source);
    }

    /**
     * unix时间戳转为指定格式的String类型
     * <p>
     * <p>
     * System.currentTimeMillis()获得的是是从1970年1月1日开始所经过的毫秒数
     * unix时间戳:是从1970年1月1日（UTC/GMT的午夜）开始所经过的秒数,不考虑闰秒
     *
     * @param source
     * @param pattern
     * @return
     */
    public static String formatTimestamp(long source, String pattern) {
        SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
        Date date = new Date(source * 1000);
        return dateFormat.format(date);
    }

    /**
     * 将日期转换为时间戳(unix时间戳,单位秒)
     *
     * @param date
     * @return
     */
    public static long parseTimestamp(Date date) {
        Timestamp timestamp = new Timestamp(date.getTime());
        return timestamp.getTime() / 1000;

    }

    /**
     * 字符串转换为对应日期(可能会报错异常)
     *
     * @param source
     * @param pattern
     * @return
     */
    public static Date parseDate(String source, String pattern) {
        SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
        Date date = null;
        try {
            date = dateFormat.parse(source);
        } catch (Exception e) {
            logger.error("字符串转换日期异常", e);
        }
        return date;
    }

    /**
     * 获得当前时间对应的指定格式
     *
     * @param pattern
     * @return
     */
    public static String formatCurrentDate(String pattern) {
        SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
        return dateFormat.format(new Date());

    }

    /**
     * 获得当前unix时间戳(单位秒)
     *
     * @return 当前unix时间戳
     */
    public static long currentTimestamp() {
        return System.currentTimeMillis() / 1000;
    }

    /**
     * 根据传入日期返回星期几
     *
     * @param date 日期
     * @return 1-7 1：星期天,2:星期一,3:星期二,4:星期三,5:星期四,6:星期五,7:星期六
     */
    public static int getDayOfWeek(Date date) {
        Calendar cal = new GregorianCalendar();
        cal.setTime(date);
        return cal.get(Calendar.DAY_OF_WEEK);
    }
}
